package com.insta.formation.library.dao.impl;

// WS Abondonner ISubsriber Service
// WS Admin IAdmintratorSercive
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.insta.formation.library.Libraryfactory;
import com.insta.formation.library.Properties;
import com.insta.formation.library.dao.IUserDao;
import com.insta.formation.library.dao.JdbcTools;
import com.insta.formation.library.model.IUser;

/**
 * Couche d'abstraction des données des utilisateurs dans la base de données
 * 
 * @author julien
 * 
 */
public class UserDaoImpl implements IUserDao
{
	final private static Logger LOGGER = LoggerFactory.getLogger(UserDaoImpl.class);

	/**
	 * Ajoute un utilisateur dans la base de données
	 * 
	 * @param user
	 *            <strong>IUser</strong> utilisateur à ajouter
	 * @return <strong>IUser</strong> utilisateur, null si l'opération a échoué
	 */
	public IUser create(IUser user)
	{
		try {
			String query = "INSERT INTO " + Properties.USERS_TABLE + " (login,password,first_name,last_name,email,is_admin) VALUES (?,?,?,?,?,?)";
			Connection conn = JdbcTools.INSTANCE.getConnection();
			PreparedStatement stmt = conn.prepareStatement(query, java.sql.Statement.RETURN_GENERATED_KEYS);

			stmt.setString(1, user.getLogin());
			stmt.setString(2, user.getPassword());
			stmt.setString(3, user.getFirstName());
			stmt.setString(4, user.getLastName());
			stmt.setString(5, user.getEmail());
			stmt.setBoolean(6, user.isAdmin());

			stmt.execute();
			ResultSet rs = stmt.getGeneratedKeys();
			if (rs.next()) {
				user.setId(rs.getBigDecimal(1).intValue());
			}
			stmt.close();
		} catch (SQLException e) {
			LOGGER.error(e.getMessage());
			// e.printStackTrace();
			user = null;
		}

		return user;
	}

	/**
	 * Récupére un utilisateur à partir de son identifiant
	 * 
	 * @param id
	 *            <strong>int</strong> identifiant de l'utilisateur
	 * @return <strong>IUser</strong> utilisateur, null si l'opération a échoué
	 */
	public IUser find(int id)
	{
		IUser user = null;
		try {
			String query = "SELECT * FROM " + Properties.USERS_TABLE + " WHERE id=?";
			Connection conn = JdbcTools.INSTANCE.getConnection();
			PreparedStatement stmt = conn.prepareStatement(query);
			stmt.setInt(1, id);
			ResultSet rs = stmt.executeQuery();
			if (rs.next()) {
				user = Libraryfactory.INSTANCE.createUser(rs.getString("login"), rs.getString("password"), rs.getString("first_name"),
						rs.getString("last_name"), rs.getString("email"), rs.getBoolean("is_admin"));
				user.setId(rs.getInt("id"));
			}
			stmt.close();

		} catch (SQLException e) {
			LOGGER.error(e.getMessage());
			// e.printStackTrace();
			user = null;
		}
		return user;
	}

	/**
	 * Récupére un utilisateur à partir de son login et de son password
	 * 
	 * @param login
	 * @param password
	 * @return <strong>IUser</strong> utilisateur, null si l'opération a échoué
	 */
	public IUser find(String login, String password)
	{
		IUser user = null;
		try {
			String query = "SELECT * FROM " + Properties.USERS_TABLE + " WHERE login=? AND password=?";
			Connection conn = JdbcTools.INSTANCE.getConnection();
			PreparedStatement stmt = conn.prepareStatement(query);
			stmt.setString(1, login);
			stmt.setString(2, password);
			ResultSet rs = stmt.executeQuery();
			if (rs.next()) {
				user = Libraryfactory.INSTANCE.createUser(rs.getString("login"), rs.getString("password"), rs.getString("first_name"),
						rs.getString("last_name"), rs.getString("email"), rs.getBoolean("is_admin"));
				user.setId(rs.getInt("id"));
			}
			stmt.close();

		} catch (SQLException e) {
			LOGGER.error(e.getMessage());
			// e.printStackTrace();
			user = null;
		}
		return user;
	}

	/**
	 * Récupére les informations d'un utilisateur dans la base de données
	 * 
	 * @param user
	 *            <strong>IUser</strong> utilisateur à modifier
	 * @return <strong>IUser</strong> utilisateur, null si l'opération a échoué
	 */
	public IUser update(IUser user)
	{
		try {
			String query = "UPDATE " + Properties.USERS_TABLE + " SET login=?,password=?,first_name=?,last_name=?,email=?,is_admin=? WHERE id=?";
			Connection conn = JdbcTools.INSTANCE.getConnection();
			PreparedStatement stmt = conn.prepareStatement(query, java.sql.Statement.RETURN_GENERATED_KEYS);

			stmt.setString(1, user.getLogin());
			stmt.setString(2, user.getPassword());
			stmt.setString(3, user.getFirstName());
			stmt.setString(4, user.getLastName());
			stmt.setString(5, user.getEmail());
			stmt.setBoolean(6, user.isAdmin());
			stmt.setInt(7, user.getId());
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			LOGGER.error(e.getMessage());
			// e.printStackTrace();
			user = null;
		}

		return user;
	}

	/**
	 * Supprime un utilisateur de la base de données
	 * 
	 * @param <strong>IUser</strong> utilisateur à supprimer
	 */
	public void delete(IUser user)
	{
		try {
			String query = "DELETE FROM " + Properties.USERS_TABLE + " WHERE id=?";
			Connection conn = JdbcTools.INSTANCE.getConnection();
			PreparedStatement stmt = conn.prepareStatement(query);
			stmt.setInt(1, user.getId());
			stmt.execute();
			stmt.close();

		} catch (SQLException e) {
			LOGGER.error(e.getMessage());
			// e.printStackTrace();
			user = null;
		}
	}

}
